在AWS EC2安装完wordpress,可能存在安装或更新插件要求输入FTP密码,uploads权限等问题,而这一切跟目录/var/www/权限有关。在网络上找到的解决方法往往不适应,因为不同实例类型(我用的是Ubuntu)的用户名、组、配置文件等不尽相同。所以决定花点时间,了解下,知其然知其所以然。懂了这些,就可以按文件作用设置不同的权限,最大限度保护数据的安全。(汗,我之前将uploads设成777权限)

1. 问题描述及解决方法

1.1 问题描述

在AWS EC2安装了wordpress,安装或更新插件要求输入FTP密码,如下:

WordPress FTP

但是AWS EC2无论是SSH或者FTP登录用的都是SSH Keys(RSA加密,文件格式为.pem),而不是密码。解决这个问题,有两个方法:其一,登录EC2,添加FTP密码;其二,修改/var/www/wordpress/文件所有者为apache

1.2 设/var/www/操作权限

复习了下Ubuntu文件权限,并参考了[2],将/var/www/操作权限设到最佳状态:

#创建一个新的组www-pub
groupadd www-pub  

#将www-data(运行web服务的用户)加到www-pub组中
usermod -a -G www-pub www-data #参数-a表示追加

#将/var/www/的组改成www-pub
chown -R ubuntu:www-pub /var/www 

#将/var/www/的权限设成2775
#chmod 2775 /var/www #2表示g+s,即组成员跟文件拥有者ubuntu具有相同的操作权限

#将所有目录操作权限设成2775
find /var/www -type d -exec chmod 2775 {} +

#将所有文件操作权限设成0664
find /var/www -type f -exec chmod 0664 {} +

操蛋的是,www-data已经拥有所需的所有权限,但更新插件时还是提示我输入ftp密码,求高人指点!

目前的解决方法是:在wp-config.php文件添加以下行:

define('FS_METHOD', 'direct');

值得注意的是,这一行不能添加在文件的末尾,而是添加在数据库定义后面,详情见我在StackOverflow的提问《WordPress needs the FTP credentials to update plugins》。

2. 用户名和组

2.1. 查看用户名

Ubuntu所有用户信息存储在/etc/passwd文件,举例如下:

root:x:0:0:root:/root:/bin/bash
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin

passwd每一行代表一个用户,包含7个域,分别表示[1]:

login name
optional encrypted password
numerical user ID
numerical group ID
user name or comment field
user home directory
optional user command interpreter

可见,所有用户的密码都是x,官方文档上说x表示密码存储在/etc/shadow文件,其实不尽然,我实例上的/etc/shadow是一个空文件。实际上,x在这里表示加密口令,AWS EC2使用key pairs(RSA公钥,密钥)进行验证。

2.2 查看组信息

Ubuntu组信息存储在/etc/group,每一行表示一个组,由5个域组成,如下:

group_name:passwd:GID:user_list

上述用户名对应的组如下:

root:x:0:

adm:x:4:syslog,ubuntu
dialout:x:20:ubuntu
cdrom:x:24:ubuntu
floppy:x:25:ubuntu
sudo:x:27:ubuntu
audio:x:29:ubuntu
dip:x:30:ubuntu
video:x:44:ubuntu
plugdev:x:46:ubuntu
netdev:x:102:ubuntu
ubuntu:x:1000:

www-data:x:33:

可见,Ubuntu属于多个组并且拥有sudo权限。www-data是默认运行web服务的用户和组。

3. 文件访问权限

用ls -l可以看到文件的访问权限,举例如下

4 drwxr-xr-x 10 ubuntu ubuntu     4096 Mar 17  2014 wp-admin
4 -rwxr-xr-x  1 ubuntu ubuntu      271 Jan  8  2012 wp-blog-header.php

诸如drwxr-xr-x,第一位表示的是文件类型,常用的是目录d和普通文件-,如下:

- : fichier standard
d : répertoire
l : lien symbolique
b : périphérique "block"
c : périphérique "character"
s : "socket"

接下来9位,3个一组,3组从左到右分别是user(u), group(g), other users/all users(o/a)。3个分别表示:

read(r)
write(w)
execute(x/X) 或 set user or group ID(s/S) 或 restricted deletion flag or sticky bit(t/T)

X表示一些用户有运行权(我没搞懂,没见过),S/T与s/t区别在于:当原文件没有执行权x,再加上s/t,那就变成S/T了。举例如下:

0 -rw-rw-r-- 1 ubuntu ubuntu    0 Jun  6 21:35 tmp.txt

$ chmod u+s tmp.txt ; ls -l
-rwSrw-r-- 1 ubuntu ubuntu    0 Jun  6 21:35 tmp.txt

$ chmod g+x tmp.txt ; chmod g+s tmp.txt ; ls -l
-rwSrwsr-- 1 ubuntu ubuntu    0 Jun  6 21:35 tmp.txt

s和t的功能如下:

  • u+s/S: 一个文件设置了u+s,相当于任何人对该文件的操作权限等同于文件所有者
  • g+s/S: 一个文件设置了g+s,文件所属的组对该文件的操作权限等同于文件所有者
  • o/a+t/T: t/T只能用于其他用户,一个文件设置了o+t,对文件尽管有写的权限但不能删除文件

通过chmod命令可以很方便修改文件或目录的权限,有两种方法:

  • 字母模式:u/g/o/a +/- r/w/x/s/t
  • 数字模型:如2755,值得注意的是,第一位中的4,2,1分别表示set user ID, set group ID, sticky

参考资料:

[1] Ubuntu manuals: passwd - the password file

[2] StackOverflow: What's the best way of handling permissions for apache2's user www-data in /var/www?

本文系Spark & Shine原创,转载需注明出处本文最近一次修改时间 2022-04-13 23:04

results matching ""

    No results matching ""